package cn.bearspark.collect.provider.dao.buffer;

import cn.bearspark.collect.provider.dao.key.CollectUserIdBufferKeyBuilder;
import cn.bearspark.collect.provider.dao.mapper.CollectMapper;
import cn.bearspark.framework.redis.starter.buffer.zset.RedisZSetBuffer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * 收藏的用户 id 的 ZSet 数据结构的缓存器
 *
 * @author f
 */
@Component
public class CollectUserIdZSetBuffer extends RedisZSetBuffer {

    private final CollectMapper collectMapper;

    private final CollectUserIdBufferKeyBuilder keyBuilder;

    public CollectUserIdZSetBuffer(RedisTemplate<String, Object> redisTemplate,
                                   CollectMapper collectMapper,
                                   CollectUserIdBufferKeyBuilder keyBuilder) {
        super(redisTemplate);
        this.collectMapper = collectMapper;
        this.keyBuilder = keyBuilder;
    }

    /**
     * 判断指定用户是否 收藏过 指定模块下的指定数据
     *
     * @param userId       指定的用户 id
     * @param moduleCode   指定的模块的枚举值
     * @param moduleDataId 指定数据的主键 id
     * @return 指定用户是否 收藏过 指定模块下的指定数据积过功德
     */
    public boolean exists(long userId, int moduleCode, long moduleDataId) {
        return super.exists(
                keyBuilder.buildCollectUserIdZSetKey(moduleCode, userId),
                moduleDataId,
                () -> collectMapper.countCollect(userId, moduleCode, moduleDataId)
        );
    }

    /**
     * 指定用户 收藏 指定模块下的指定数据的缓存
     *
     * @param userId       指定的用户 id
     * @param moduleCode   指定的模块的枚举值
     * @param moduleDataId 指定数据的主键 id
     */
    public void clean(long userId, int moduleCode, long moduleDataId) {
        super.clean(keyBuilder.buildCollectUserIdZSetKey(moduleCode, userId), moduleDataId);
    }
}
